package poly_detail;

public class PolyDetail01 {
    public static void main(String[] args) {
        //向上转型：父类的引用指向了子类的对象
        //语法：父类的类型 引用名 = new 子类类型( );
        Animal animal = new Cat();//animal-->一个Cat对象
        Object obj = new Cat();//Object也是Cat的父类
        //父类可以指直接父类也可以指父类的父类
        System.out.println("ok~");

        //可以调用父类中所有成员（需遵守访问权限,私有的不能访问）
        //但是不能调用子类特有的成员
        //animal.catchMouse();//错误
        //在编译阶段，能调用哪些成员，是由编译类型决定的
        animal.eat();//猫吃鱼 animal运行类型是Cat
        animal.run();//跑
        animal.show();//hello~你好
        animal.sleep();//睡
        //最终运行效果看子类的具体实现
        //即调用方法时，按照从子类开始查找方法，然后调用
        //规则与前面学过的方法调用规则一致

        //多态的向下转型
        //现在我们想调用Cat的catchMouse方法
        Cat cat = (Cat) animal;//强转
        //cat的编译类型是Cat,运行类型是Cat,原因：已经强制类型转换了
        cat.catchMouse();
        // 要求父类的引用必须指向的是当前目标类型的对象

        //Dog dog = (Dog) animal;//错误
        // animal原先指向的是Cat类型，Cat类型不能强转成Dog
    }
}
